package com.yuxl.admin.manager.auth.server.controller;

import com.yuxl.admin.manager.auth.core.entity.AuthRole;
import com.yuxl.admin.manager.auth.core.entity.AuthUser;
import com.yuxl.admin.manager.auth.core.service.AuthRoleService;
import com.yuxl.admin.manager.auth.core.service.AuthUserService;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.springframework.graphql.data.method.annotation.Argument;
import org.springframework.graphql.data.method.annotation.MutationMapping;
import org.springframework.graphql.data.method.annotation.QueryMapping;
import org.springframework.graphql.data.method.annotation.SchemaMapping;
import org.springframework.stereotype.Controller;
import reactor.core.publisher.Flux;
import reactor.core.publisher.Mono;

/**
 * GraphQL角色控制器
 * 处理与角色相关的GraphQL查询和变更
 * @author yuxl
 */
@Slf4j
@Controller
@RequiredArgsConstructor
public class GraphQLRoleController {

    private final AuthRoleService authRoleService;
    private final AuthUserService authUserService;

    /**
     * 根据ID查询角色
     * @param id 角色ID
     * @return 角色信息
     */
    @QueryMapping
    public Mono<AuthRole> role(@Argument Long id) {
        // 调用authRoleService的findById方法查找角色
        return authRoleService.findById(id);
    }

    /**
     * 查询所有角色
     * @return 所有角色的列表
     */
    @QueryMapping
    public Flux<AuthRole> roles() {
        // 调用authRoleService的findAll方法获取所有角色
        return authRoleService.findAll();
    }

    /**
     * 查询用户的角色
     * @param userId 用户ID
     * @return 用户拥有的角色列表
     */
    @QueryMapping
    public Flux<AuthRole> userRoles(@Argument Long userId) {
        // 调用authRoleService的findRolesByUserId方法获取用户的角色
        return authRoleService.findRolesByUserId(userId);
    }

    /**
     * 根据标记查询角色
     * @param mark 角色标记
     * @return 匹配的角色列表
     */
    @QueryMapping
    public Flux<AuthRole> rolesByMark(@Argument String mark) {
        // 调用authRoleService的findByMark方法查找角色
        return authRoleService.findByMark(mark);
    }

    /**
     * 分页查询角色
     * @param page 页码
     * @param size 每页大小
     * @return 分页后的角色列表
     */
    @QueryMapping
    public Flux<AuthRole> rolesPage(@Argument Integer page, @Argument Integer size) {
        // 调用authRoleService的findAll方法，传入分页参数
        return authRoleService.findAll(page, size);
    }

    /**
     * 创建新角色
     * @param input 角色输入数据
     * @return 创建的角色信息
     */
    @MutationMapping
    public Mono<AuthRole> createRole(@Argument AuthRole input) {
        // 调用authRoleService的createRole方法创建新角色
        return authRoleService.createRole(input);
    }

    /**
     * 更新角色信息
     * @param id 角色ID
     * @param input 更新的角色数据
     * @return 更新后的角色信息
     */
    @MutationMapping
    public Mono<AuthRole> updateRole(@Argument Long id, @Argument AuthRole input) {
        // 调用authRoleService的updateRole方法更新角色
        return authRoleService.updateRole(id, input);
    }

    /**
     * 删除角色
     * @param id 要删除的角色ID
     * @return 删除操作是否成功
     */
    @MutationMapping
    public Mono<Boolean> deleteRole(@Argument Long id) {
        // 调用authRoleService的deleteRole方法删除角色
        return authRoleService.deleteRole(id);
    }

    /**
     * 获取拥有特定角色的用户列表
     * @param role 角色对象
     * @return 拥有该角色的用户列表
     */
    @SchemaMapping(typeName = "Role", field = "users")
    public Flux<AuthUser> getUsers(AuthRole role) {
        // 调用authUserService的findUsersByRoleId方法获取拥有该角色的用户
        return authUserService.findUsersByRoleId(role.getId());
    }
}
